#ifndef _LVGL_LITTLE_PRO_H_
#define _LVGL_LITTLE_PRO_H_

#include "../lvgl/lvgl.h"

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <errno.h>
#include <unistd.h> // 用于unlink函数
#include <time.h>
#include <pthread.h>

#define DEFULT_DIR_PATH "/pic"
#define FILE_BTN_W      200
#define FILE_BTN_H      140
#define BUTTONS_PER_PAGE 9  // 每页显示9个按钮
#define MAX_PROGRESS 100

typedef struct demo_inf {
    lv_obj_t * main_screen; // 顶层屏幕
    lv_obj_t * album_left;  // 左边的相册控件
    lv_obj_t * game_right;  // 右边的游戏控件
    struct btn_push_inf * dir_btn_inf_list_head; // 目录按钮链表的头结点

    int exit_mask;
} DI, *DI_P;
 
typedef struct btn_push_inf {
    char new_dir_path[256*2]; // 新的目录路径
    char file_name[256];      // 文件名字
    DI_P dip;                 // 堆空间结构体
 
    struct btn_push_inf * next;
    struct btn_push_inf * prev;
} BTN_NODE, *BTN_LINK;
 
typedef struct Show_Need {
    DI_P dip;
    const char * obj_dir_path;
    BTN_LINK btn_inf_node; 
    int current_page;
    int btn_nums;

} SI, *SI_P;

typedef struct {
    lv_obj_t *time_label; // 时间标签的指针
    bool running;         // 用于控制线程的停止
} ThreadData;

DI_P Demo_Init();
bool Demo_Running(DI_P dip);
bool Demo_Free(DI_P dip);

// bool Show_Main_Screen(DI_P dip);
bool Show_Main_Screen(DI_P dip, const char *dir_path);
BTN_LINK Create_Dir_Btn_Node(); // 创建节点
bool Add_Dir_Btn_Node(DI_P dip, BTN_LINK new_node);  // 头插法
void File_Btn_Push_Task(lv_event_t * e);
bool Show_File_Btn(BTN_LINK btn_node, int btn_x, int btn_y);
void Show_Image(const char * file_name, DI_P dip, BTN_LINK btn_inf_node);
bool Destroy_Dir_Btn_List(BTN_LINK head);
void exit_btn_event_handler(lv_event_t * e);
void Show_Previous_Image(lv_event_t * e);
void Show_Next_Image(lv_event_t * e);

void Show_Dir_List(lv_event_t * e);
void prev_page_event_handler(lv_event_t * e);
void next_page_event_handler(lv_event_t * e);
static bool Process_Directory_Entries(DIR *dp, SI_P si_data, int start_index, int count);
static void Create_Navigation_Buttons(lv_obj_t *main_screen, void *user_data);
void File_Btn_Del_Push_Task(lv_event_t * e);

void Show_Progress_Bar(DI_P dip);
void exit_btn_event_handler_main(lv_event_t * e);
void game_ui(lv_event_t * e);


/****************** */
// void snake_game_init(void);
// 定义蛇活动范围的边界
#define GAME_AREA_X_MIN 0
#define GAME_AREA_X_MAX (GRID_WIDTH - 1)
#define GAME_AREA_Y_MIN 0
#define GAME_AREA_Y_MAX (GRID_HEIGHT - 1)
void snake_game_init(DI_P dip);
static void keypad_event_cb(lv_event_t * e);
static void direction_event_cb(lv_event_t * e);
static void game_update(lv_timer_t * timer);
static void create_food();
static void direction_event_cb(lv_event_t * e);
static void keypad_event_cb(lv_event_t * e);
void exit_to_main(lv_event_t * e);
void release_snake_game_resources(void);
static void update_time_callback(void *label, int32_t user_data);
void *update_time_thread(void *arg);


/***************** */
#endif